package network_programming.np1_socket_and_serversocket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;

public class UDPSendDemo {
    public static void main(String[] args) {
        UDPSendDemo sd = new UDPSendDemo();
        sd.sendUDPData();
    }
    /*
    * 发送数据的步骤
    * 1、创建发送端的Socket对象(DatagramSocket)。如果没有指定端口，发送到本地主机所有可用端口（不常用），这里可以采用指定端口构造方法
    * DatagramSocket()，DatagramSocket(int port)
    *
    * 2、创建数据，并把数据封装成DatagramPacket包裹，数据一定要转成字节数组，同时需要指定IP地址和端口
    * DatagramPacket(byte[] buf, int length, InetAddress address, int port)
    *
    * 3、调用DatagraSocket对象的方法发送数据包
    * void send(DatagramPacket p)
    *
    * 4、关闭发送端，释放资源
    * void close()
    * */
    public void sendUDPData() {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   // 封装键盘输入流
        String line = null;
        /*
          通常我们使用try…catch()捕获异常的，如果遇到类似IO流的处理，要在finally部分关闭IO流，当然这个是JDK1.7之前的写法了；
          在JDK7优化后的try-with-resource语句，该语句确保了每个资源,在语句结束时关闭。所谓的资源是指在程序完成后，必须关闭的流对象。
          写在()里面的流对象对应的类都实现了自动关闭接口AutoCloseable
         */
        try (DatagramSocket dSocket = new DatagramSocket(9293)) {   // 创建发送端socket对象
//            byte[] data = "数据一定要转成字节数组".getBytes();     // 创建数据
            byte[] data;
            while((line = br.readLine()) != null) {
                data = line.getBytes();
                DatagramPacket dPacket = new DatagramPacket(data, data.length,
                        InetAddress.getByName("127.0.0.1"), 9295);      // 打包数据
                dSocket.send(dPacket);      // 发送数据
                if(line.equals("886"))
                    break;
            }
            // dSocket.close();    // 关闭socket
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
